package com.dragon.refect.error;

import java.lang.reflect.Field;

/**
 * String s = "abc";
 * "abc"是字面量，所以"abc"的引用会存储在常量池(类似于HashMap中)，返回引用给s变量
 * <p>
 * String s1 = new String("abc");
 * 因为"abc"常量已经在常量池中存在，所以不需要创建"abc"了，但是有new关键字，new字节码指令会在堆内存中重新
 * 开辟空间，创建对象，但是堆中的对象与常量池中的对象底层的字符数组都是同一个
 *
 * @author dragon
 * @since 2019/12/12
 */
public class StringInternTest3 {

    public static void main(String[] args) throws Exception {
        String s = "abc";
        String s1 = new String("abc");

        Field value = String.class.getDeclaredField("value");

        value.setAccessible(true);

        char[] array = (char[]) value.get(s);

        array[0] = '0';

        System.out.println(s);

        System.out.println(s1);
    }
}
